#include "QtGui"
#include "QWidget"
#include "QPainter"

#include <math.h>

#include "creadorceldascuadradas.h"
#include "creadorceldastriangulares.h"
#include "pintorcontorno.h"

#include "pintorescaque.h"
#include "dibujo.h"

#include "caleidoscopio.h"

Caleidoscopio::Caleidoscopio(QWidget *padre) : QWidget(padre)
{
    //_pintorCaleidoscopico.agregarDibujo(new DibujoCirculo);

   // _creadorCeldas = ;
    _motor = new VisitadorCeldas(new CreadorCeldasTriangulares);

    PintorCaleidoscopico *pintor = new PintorCaleidoscopico;
    pintor->agregarDibujo(new DibujoArcoiris);

    _pintor = pintor;
    _angulo = 0;
}

void Caleidoscopio::paintEvent(QPaintEvent *evento)
{
    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setWindow(xmin, ymin, xmax - xmin, ymax - ymin);

#ifdef TEST
    pintarTest(painter);
#else
    pintarMaya(painter);
#endif
}

void Caleidoscopio::showEvent(QShowEvent *evento) {
    actualizacionTimerId = startTimer(LATENCIA);
}

void Caleidoscopio::timerEvent(QTimerEvent *evento)
{
    if (evento->timerId() != actualizacionTimerId)
    {
        QWidget::timerEvent(evento);
        return;
    }

    update();

}

void Caleidoscopio::pintarMaya(QPainter &painter)
{
    _angulo += pasoRotacion;
    if (_angulo > 360)
        _angulo -= 360;
    painter.rotate(_angulo);

    QPainterPath clipPath;
    clipPath.addEllipse(xmin, ymin, xmax, ymax);
    //painter.setClipPath(clipPath);

    _pintor->asignarContextoGrafico(&painter);

    _motor->visitar(Referencia<Visitante>(_pintor));
}

void Caleidoscopio::pintarTest(QPainter &painter)
{
    int medioLado = lado / 2;
    // Test para comprobar el interior de una celda
     Referencia<Celda> celda (new Celda);
     celda->agregarPunto(Punto(-medioLado, 0));
     celda->agregarPunto(Punto(medioLado, 0));
     celda->agregarPunto(Punto(medioLado, lado));
     celda->agregarPunto(Punto(-medioLado, lado));
     celda->agregarPunto(Punto(-medioLado, 0));


     _pintor->asignarContextoGrafico(&painter);
     _pintor->visitar(celda);
     _pintor->actualizar();

     PintorContorno pintorContorno;
     pintorContorno.asignarContextoGrafico(&painter);
     pintorContorno.visitar(celda);
}
